/**
 * Next.js 中间件 - 处理路由保护和用户认证
 * 在请求到达页面或 API 路由之前进行拦截和验证
 */

import { NextResponse } from 'next/server';
import type { NextRequest } from 'next/server';
import { verifyToken } from '@/lib/auth';

/**
 * 中间件主函数
 * @param request 当前请求对象
 * @returns 响应对象或继续处理
 */
export async function middleware(request: NextRequest) {
  const { pathname } = request.nextUrl;

  // 保护管理后台路由，需要用户登录
  if (pathname.startsWith('/admin')) {
    // 从 cookie 中获取认证令牌
    const token = request.cookies.get('auth-token')?.value;
    
    // 如果没有令牌，重定向到登录页面
    if (!token) {
      return NextResponse.redirect(new URL('/login', request.url));
    }

    // 验证令牌的有效性
    const payload = await verifyToken(token);
    
    // 如果令牌无效或过期，重定向到登录页面
    if (!payload) {
      return NextResponse.redirect(new URL('/login', request.url));
    }

    // 将用户信息添加到请求头中，供后续处理使用
    const requestHeaders = new Headers(request.headers);
    requestHeaders.set('x-user-id', payload.userId);
    requestHeaders.set('x-user-email', payload.email);
    requestHeaders.set('x-user-role', payload.role);

    // 继续处理请求，并传递用户信息
    return NextResponse.next({
      request: {
        headers: requestHeaders,
      },
    });
  }

  // 对于其他路由，直接继续处理
  return NextResponse.next();
}

// 中间件配置 - 指定需要拦截的路径
export const config = {
  matcher: [
    '/admin/:path*',        // 管理后台所有路由
    '/api/posts/:path*',    // 文章相关 API
    '/api/comments/:path*', // 评论相关 API
    '/api/stats/:path*',    // 统计相关 API
    '/api/upload/:path*'    // 文件上传 API
  ]
};
